package com.robotic.tcp;

import com.alibaba.fastjson2.JSONObject;
import com.robotic.route.service.impl.RoutePointDetailServiceImpl;
import com.robotic.udp.ExecuteNavigation;
import com.robotic.websocket.WebSocketServerKey;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * 机器人状态监视器.
 * 职责: 定时轮询机器人状态，并将获取到的数据进行处理（如WebSocket推送）。
 * 它不关心如何与机器人通信，只关心何时获取数据以及如何使用数据。
 */
@Slf4j
@Component
public class RobotMonitor {

    @Autowired
    private WebSocketServerKey socketServerKey;

    @Autowired
    private RobotCommunicationService communicationService; // 注入新的通信服务

    public static List<Object> xyList = new ArrayList<>(); // 类型改为 JSONObject

    private int loopCounter = 0;

    public static double robotX = 0D;
    public static double robotY = 0D;

    // 不再需要管理Socket和连接状态
    // 不再需要RobotStatus内部类
    // 不再需要messageId

    @Scheduled(fixedRate = 1000)
    public void pollRobotStatus() {
        try {
            // 通过轮询交替获取两种类型的状态
            String requestType = (loopCounter % 2 == 0) ? "1002" : "2001";

            RobotState state = communicationService.fetchRobotState(requestType);

            if (state != null) {
                // 将获取到的数据进行处理
                processStateData(state);
            }

            loopCounter++;
        } catch (Exception e) {
            // 捕获所有可能的异常，防止调度任务中断
            log.error("轮询机器人状态时发生顶层异常: {}", e.getMessage(), e);
        }
    }

    /**
     * 处理获取到的机器人状态数据.
     * @param state 包含机器人状态的DTO对象
     */
    private void processStateData(RobotState state) {
        // 只有当坐标有效时才进行推送和记录
        if (state.hasValidCoordinates()) {
            JSONObject json = new JSONObject();
            json.put("X", state.getPosX());
            json.put("Y", state.getPosY());
            json.put("Z", state.getPosZ());

            JSONObject speed = new JSONObject();
            speed.put("X", state.getSpeed());
            speed.put("Y", state.getSpeed()); // 假设速度在各轴上相同
            speed.put("Z", state.getSpeed());
            json.put("Speed", speed);

            robotX = state.getPosX();
            robotY = state.getPosY();
            // 1. 通过WebSocket推送
            socketServerKey.sendOneMessage("leg_odom", json.toString());

            // 2. 如果导航任务正在进行，则记录坐标
            if (RoutePointDetailServiceImpl.startPlayer) {
                xyList.add(json);
            } else {
                // 如果导航已停止，清空历史轨迹
                if (!xyList.isEmpty()) {
                    xyList = new ArrayList<>();
                }
            }
        }

        // 这里还可以添加处理电池信息、运动状态等的逻辑
        // 例如: log.info("机器人电量: {}", state.getElectricity());
    }
}
